#!/usr/bin/env node

/**
 * 表配置管理工具
 * 
 * 此脚本用于管理数据库表的配置状态，包括启用/禁用表以及自定义配置选项
 * @author Urban Lifeline Team
 */

const fs = require('fs');
const path = require('path');
const chalk = require('chalk');
const ora = require('ora');

// 配置文件路径
const CONFIG_DIR = path.join(__dirname, '../.config');
const TABLE_CONFIG_FILE = path.join(CONFIG_DIR, 'table-config.json');

// 确保配置目录存在
if (!fs.existsSync(CONFIG_DIR)) {
    fs.mkdirSync(CONFIG_DIR, { recursive: true });
}

/**
 * 读取表配置
 * @returns {Object} 表配置对象
 */
function readTableConfig() {
    if (!fs.existsSync(TABLE_CONFIG_FILE)) {
        return {};
    }

    try {
        const content = fs.readFileSync(TABLE_CONFIG_FILE, 'utf8');
        return JSON.parse(content);
    } catch (error) {
        console.error(chalk.red('错误: 读取表配置文件失败'), error.message);
        return {};
    }
}

/**
 * 保存表配置
 * @param {Object} config 表配置对象
 */
function saveTableConfig(config) {
    try {
        fs.writeFileSync(TABLE_CONFIG_FILE, JSON.stringify(config, null, 2), 'utf8');
    } catch (error) {
        console.error(chalk.red('错误: 保存表配置文件失败'), error.message);
        process.exit(1);
    }
}

/**
 * 列出所有表配置
 */
function listTableConfig() {
    console.log(chalk.blue('=== 表配置列表 ==='));

    const config = readTableConfig();
    const tableNames = Object.keys(config);

    if (tableNames.length === 0) {
        console.log(chalk.yellow('未找到任何表配置，请先获取表列表或手动添加表配置'));
        return;
    }

    // 创建表格式输出
    console.log('┌' + '─'.repeat(40) + '┬' + '─'.repeat(15) + '┬' + '─'.repeat(40) + '┐');
    console.log('│ ' + chalk.yellow('表名'.padEnd(38)) + ' │ ' +
        chalk.yellow('状态'.padEnd(13)) + ' │ ' +
        chalk.yellow('自定义配置'.padEnd(38)) + ' │');
    console.log('├' + '─'.repeat(40) + '┼' + '─'.repeat(15) + '┼' + '─'.repeat(40) + '┤');

    tableNames.forEach(tableName => {
        const tableConfig = config[tableName];
        const status = tableConfig.enabled ? chalk.green('启用') : chalk.red('禁用');

        // 自定义配置信息
        let customConfig = '';
        if (tableConfig.customConfig) {
            const customKeys = Object.keys(tableConfig.customConfig).slice(0, 2);
            if (customKeys.length > 0) {
                customConfig = customKeys.map(key => `${key}: ${JSON.stringify(tableConfig.customConfig[key]).substring(0, 15)}`).join(', ');
                if (Object.keys(tableConfig.customConfig).length > 2) {
                    customConfig += '...';
                }
            }
        }

        console.log('│ ' + chalk.cyan(tableName.padEnd(38)) + ' │ ' +
            status.padEnd(13) + ' │ ' +
            customConfig.padEnd(38) + ' │');
    });

    console.log('└' + '─'.repeat(40) + '┴' + '─'.repeat(15) + '┴' + '─'.repeat(40) + '┘');
    console.log(`共 ${tableNames.length} 个表`);
}

/**
 * 启用表
 * @param {string} tableName 表名
 */
function enableTable(tableName) {
    if (!tableName) {
        console.error(chalk.red('错误: 表名不能为空'));
        process.exit(1);
    }

    const spinner = ora(`正在启用表 ${chalk.cyan(tableName)}...`).start();

    const config = readTableConfig();

    // 如果表不存在于配置中，创建新配置
    if (!config[tableName]) {
        config[tableName] = {
            enabled: true,
            customConfig: {}
        };
    } else {
        config[tableName].enabled = true;
    }

    saveTableConfig(config);
    spinner.succeed(chalk.green(`表 ${chalk.cyan(tableName)} 已成功启用`));
}

/**
 * 禁用表
 * @param {string} tableName 表名
 */
function disableTable(tableName) {
    if (!tableName) {
        console.error(chalk.red('错误: 表名不能为空'));
        process.exit(1);
    }

    const spinner = ora(`正在禁用表 ${chalk.cyan(tableName)}...`).start();

    const config = readTableConfig();

    // 如果表不存在于配置中，创建新配置
    if (!config[tableName]) {
        config[tableName] = {
            enabled: false,
            customConfig: {}
        };
    } else {
        config[tableName].enabled = false;
    }

    saveTableConfig(config);
    spinner.succeed(chalk.green(`表 ${chalk.cyan(tableName)} 已成功禁用`));
}

/**
 * 更新表配置
 * @param {string} tableName 表名
 * @param {string} customConfigStr 自定义配置JSON字符串
 */
function updateTableConfig(tableName, customConfigStr) {
    if (!tableName) {
        console.error(chalk.red('错误: 表名不能为空'));
        process.exit(1);
    }

    if (!customConfigStr) {
        console.error(chalk.red('错误: 自定义配置不能为空'));
        process.exit(1);
    }

    const spinner = ora(`正在更新表 ${chalk.cyan(tableName)} 的配置...`).start();

    try {
        // 解析自定义配置
        const customConfig = JSON.parse(customConfigStr);

        const config = readTableConfig();

        // 如果表不存在于配置中，创建新配置
        if (!config[tableName]) {
            config[tableName] = {
                enabled: true,
                customConfig: customConfig
            };
        } else {
            config[tableName].customConfig = customConfig;
        }

        saveTableConfig(config);
        spinner.succeed(chalk.green(`表 ${chalk.cyan(tableName)} 的配置已成功更新`));

        // 显示更新后的配置
        console.log(chalk.blue('\n更新后的配置:'));
        console.log(JSON.stringify(config[tableName], null, 2));

    } catch (error) {
        spinner.fail(chalk.red(`更新表 ${chalk.cyan(tableName)} 的配置失败`));
        console.error(`错误: ${error.message}`);
        process.exit(1);
    }
}

/**
 * 主函数
 */
function main() {
    const command = process.argv[2];
    const tableName = process.argv[3];
    const customConfigStr = process.argv[4];

    switch (command) {
        case 'list':
            listTableConfig();
            break;

        case 'enable':
            enableTable(tableName);
            break;

        case 'disable':
            disableTable(tableName);
            break;

        case 'update':
            updateTableConfig(tableName, customConfigStr);
            break;

        default:
            console.log(chalk.blue('=== 表配置管理工具 ==='));
            console.log('\n用法:');
            console.log('  node generateTableConfig.js list              # 列出所有表配置');
            console.log('  node generateTableConfig.js enable <表名>     # 启用指定表');
            console.log('  node generateTableConfig.js disable <表名>    # 禁用指定表');
            console.log('  node generateTableConfig.js update <表名> <JSON> # 自定义表配置');
            console.log('\n示例:');
            console.log('  node generateTableConfig.js enable demo_table');
            console.log('  node generateTableConfig.js update demo_table \'{"ignoreFields":["id","created_at"]}\'');
            break;
    }
}

// 执行主函数
main();